תמיד רציתם להתחבר מהקוד PHP שלכם לאתרים שונים, או לשלוח POST/GET לאתר מסוים, או סתם לקבל את הקוד מקור של האתר? - cURL
מה זה curl
cURL הינה סיפרייה שנועדה לעבודה עם פרוטוקולים שונים כגון http, ftp, imap, smtp ועוד
(ניתן לראות את כולם כאן: http://en.wikipedia.org/wiki/CURL).
curl קיימת לא רק בPHP, אלא גם שפות כמו פייתון, פרל, C, באש ונתמכת ע"י לינוקס, מאק וחלונות.
עם הסיפרייה ניתן לעשות דברים מגוונים ובינהם לשלוח POST/GET, להעלות קבצים לFTP, לעבוד עם פרוקסי, לשמור קוקיז ולבנות crawlerים, ועוד המון דברים אחרים (שניתן לראות בקישור הוויקיפדיה).
לעבודה
כאן אנחנו נלמד איך עובדים עם הסיפריה בPHP.
לפני העבודה תצטרכו להתקין את הסיפריה, רק לאחר מכן תוכלו לעבוד איתה.
curl_init
היא הפונקציה שאיתה מתחילים עבודה עם cURL.
יש לה פרמטר אחד, שאפשר להשאיר אותו ריק, שזה הקישור.
לדוגמא:
$ch = curl_init(); // or with url: $ch = curl_init('http://google.com');
וככה התחלנו את הסיישן שלנו.
curl_setopt
היא הפונקציה שמשחקת את התפקיד הראשי פה.
בא מגדירים אופציה (ומכאן נובע השם setopt = set option), אשר תשתמש אותנו בעבודה.
המבנה של הפונקציה הוא ככה:
bool curl_setopt ( resource $ch , int $option , mixed $value )
הפונקציה מחזירה בוליאן.
הפרמטר הראשון זהו המשתנה עם הסיישן (ראה דוגמא עם הפונקציה curl_init).
הפרמטר השני זה האופציה (ניתן לראות את כל האופציות כאן)
הפרמטר השלישי הוא הערך.
נתחיל בדוגמא איך לקחת את המקור של מאקו:
<?php
// create a new cURL resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.mako.co.il/");
curl_setopt($ch, CURLOPT_HEADER, 0);
// grab URL and pass it to the browser
curl_exec($ch);
// close cURL resource, and free up system resources
curl_close($ch);
?>
// create a new cURL resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.mako.co.il/");
curl_setopt($ch, CURLOPT_HEADER, 0);
// grab URL and pass it to the browser
curl_exec($ch);
// close cURL resource, and free up system resources
curl_close($ch);
?>
יש לכם הערות שמסבירים מה הולך פה.
בשלב הראשון הוא יוצר עבודה עם curl.
בשלב השני הוא עושה אופציה CURLOPT_URL ומכניס קישור (האופציה הנ"ל שוות ערך לגדרת הקישור כבר ביצירת הסיישן).
בנוסף לזה - מכבים את האופציה של HEADER שזה לא יהיה כלול בפלט.
בשלב השלישי הוא משתמש בפונקציה curl_exec אשר מריצה את מה שעשינו בעצם.
בשלב הרביעי סוגרים את הסיישן ע"י curl_close (לא חובה, אבל רצוי מאוד).
וזהו, יש לנו את הקוד.
פשוט נכון?
חשוב לדעת, הפלט יודפס אוטומטי אלא אם כן להוסיף את האופציה CURLOPT_RETURNTRANSFER כTRUE. כלומר, אם תריצו את הקוד הפלט יודפס.
אני אלמד אתכם על עוד כמה אופציות חיוניות, שיעזרו לכם.
CURLOPT_URL
כמו שאמרתי לפני זה, האופציה הזו משתמשת להגדרת הקישור שאיתו אנחנו הולכים לעבוד.
אני אישית מעדיף לעשות ככה, מאשר להגדיר בINIT עצמו.
CURLOPT_HEADER
מחזיר האדר של הדף.
קחו דוגמא להאדר שהתקבל אחרי ששלחתי בקשה למאקו:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Powered-By-Mako-Render: WS04, 60000, Mf:Mf, #22, 45_1309201125725
Connection: close
Date: Mon, 27 Jun 2011 19:01:51 GMT
Server: Microsoft-IIS/6.0
X-BE-SRV: vap04
X-Powered-By: ASP.NET
Via: CN-5000, CN-5000
Content-Type: text/html;charset=UTF-8
Accept-Ranges: bytes
Cache-Control: private, max-age=30 Age: 0
Expires: Mon, 27 Jun 2011 19:02:21 GMT
x-cdn: Served by Cotendo
Transfer-Encoding: chunked
Connection: Keep-Alive
Server: Apache-Coyote/1.1
X-Powered-By-Mako-Render: WS04, 60000, Mf:Mf, #22, 45_1309201125725
Connection: close
Date: Mon, 27 Jun 2011 19:01:51 GMT
Server: Microsoft-IIS/6.0
X-BE-SRV: vap04
X-Powered-By: ASP.NET
Via: CN-5000, CN-5000
Content-Type: text/html;charset=UTF-8
Accept-Ranges: bytes
Cache-Control: private, max-age=30 Age: 0
Expires: Mon, 27 Jun 2011 19:02:21 GMT
x-cdn: Served by Cotendo
Transfer-Encoding: chunked
Connection: Keep-Alive
שתבינו פחות או יותר איך זה נראה.
CURLOPT_USERAGENT
האופציה משתמשת על מנת להגדיר USER AGENT לבקשה שלנו.
לדוגמא:
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
CURLOPT_POST, CURLOPT_POSTFIELDS
בשביל לשלוח POST, קודם נצטרך לאפשר זאת ע"י האופציה CURLOPT_POST.
לאחר שאישרנו, אנחנו שולחים POST עם האופציה CURL_POSTFIELDS
דוגמא:
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "par1=val1&par2=val2");
curl_setopt($ch, CURLOPT_POSTFIELDS, "par1=val1&par2=val2");
זוהי דוגמא לאיך POST נראה. איפה שכתבתי את הPOST, אתם יכולים גם להכניס מערך.
לדוגמא:
$array = array("par1" => "val1", "par2" => "val2")
curl_setopt($ch, CURLOPT_POSTFIELDS, $array);
curl_setopt($ch, CURLOPT_POSTFIELDS, $array);
ופונקציה נוספת (פונקציה, לא אופציה): curl_getinfo
הפונצקיה מחזירה נתונים על הסיישן, כגון קישור, סוג תקשורת, תגובה.
בנוסף יש לו פרמטר אופציה (לא כמו בcurl_setopt, אופציות אחרות) שיחזיר את המידע שאתם צריכים. אם הפרמטר הזה לא מוחזר PHP יחזיר מערך עם נתונים קבועים שאתם יכולים לראות אותו כאן: http://www.php.net/manual/en/function.curl-getinfo.php
את כל העבודה שלנו אנחנו סוגרים עם פונקציה curl_close($resource)
כאשר $resource הוא המשתנה שהתחלתם איתו את העבודה בcurl.
זהו למדריך :-)
כמה טיפים:
תכתבו מחלקה. כן, זה מעצבן לכתוב את זה, אז פשוט תכתבו מחלקה. כשהתחלתי ללמוד את הנושא הזה בניתי מחלקה וזה גם עזר לי ללמוד ועד היום אני משתמש באותה מחלקה והיא מקצרת לי תקוד, וגם בכללי נוח לעבוד עם מחלקה.
כמו כן, חשוב להזכיר שוב, על מנת לעבוד עם הסיפרייה נצטרך קודם להתקין אותה.
לימדתי כאן כמה פונקציות מרכזיות, את השאר אתם יכולים ללמוד לבד כאן: http://php.net/manual/en/book.curl.php
הסוף))
תגובות לכתבה:
מיכאל, קודם כל תודה רבה על המדריך. ממש אהבתי אותו. המדריך מאוד מאורגן מסודר וברור.
ברשותך הוסיף לכתבה ואומר שכל בקשה ותשובה בין הדפדפן לשרת מכילה נתונים וכותרים. הכותרים (header) של תשובת שרת מכילים מידע על קידוד העמוד, סוג התוכן, תאריך יצירת העמו, שם/סוג וגרסת השרת המפעיל.
הנתונים האלה לא נמצאים בתוך קוד ה-html בתגים מיוחדים, אלה מועברים בנוסף לתוכן. כמו נתונים על מעטפה במכתב שמכילים מידע על מי, מאיפה ולאן נשלח המכתב עם הבול, כך גם כותרים באים עם כל מכתב של נתונים, אבל לא נמצאים בתוך המכתב עצמו.
הכותרים שרשימה ארוכה שלהם ממאקו שראינו - יודפסו לכם למסך גם כן, כיוון ש curl תציג את כל תוכן הבקשה (כולל המעטפה). כדי לוותר על המעטפה יש צורך בלהגדיר: "אין צורך בכותרים" באופן הבא:
curl_setopt($ch, CURLOPT_NOHEADER, true); //x
שאומר - אל תביא לי את הכותרים.
מסובר על זה במדריך. רציתי רק להרחיב מעט על הכותרים עצמם. שוב כל הכבוד מיכאל :-)
CURL זה לעצלנים. מה הבעיה לעבוד עם סוקט מול פרוטוקולי HTTP ולכתוב מחלקה כבר עם המימוש הזה? ומה אם המחלקה לא מותקנת?
לדוגמה: כתבתי בפייתון תוכנית שהשתמשה בCURL, וכשהעלתי לSHELL גיליתי שאין שם CURL -> נדפקתי. הייתי צריך לשכתב הכל בעזרת הספריות urllib2 urllib וכו'...
כמו כן, בC, כמה שלא ניסיתי לא הבנתי איך לעבוד עם CURL. מה שכן הבנתי שסוקטים הרבה יותר פשוט ממה שזה נראה
נ.ב למה צריך JS כדי לשלוח תגובה? מה עם NOSCRIPT?
noscript זה לעצלנים, תפעיל js :)
כל אחד עם דרך העבודה שלו. מבחינתי לכתוב קוד 8 שורות הרבה יותר קל ומהר מלכתוב את אותו דבר על גבי סוקטים. לא ברור רק מה הם היתרונות של סוקטים ולמה להשתמש בשכבות אבסטרקציה אחרות זה בסדר (למשל pdo) ודווקא curl היא לעצלנים.
בכל אופן, אף אחד לא מגביל אותי או אותך. תכתוב איך שנוח לך. זה זכותך והקוד שלך :)
Qazjap11 זה חבר שלי, הוא פעם בנה בוט בפייתון עם curl ואז גילה שהשרת לא תומך בזה מאז הוא נגד curl ))
זה עניין של מה אתה מעוניין לעשות, אם אתה רוצה לממש לקוח HTTP שיטפל בכל המצבים השונים שיבושם לך. אבל אין שום סיבה לא להשתמש בכלים נוחים שקיימים בחוץ שרק יקצרו את זמן העבודה שלך.
מתכנתים טובים הם עצלנים: http://blogoscoped.com/archive/2005-08-24-n14.html
curl לעצלנים? מי שאומר כך לא מבין כנראה עד הסוף מה זה curl.
אני עם lulzsec .
ואני עדיין מחפש מה הקשר חח ..
לנושא: cURL אחלה ספריה, נוחה וגמישה רצח .
מדריך נחמד, רק הוא לא מפורט יותר מדי, אבל לפחות הבאת את הנקודות החשובות, כל הכבוד !
מדריך נחמד, סוקר נושאים חשובים בספרייה cURL, ספרייה מעולה, קלה לשימוש ונוחה.
מדריך יפה, כל הכבוד!
אלכס,תודה רבה על עוד מאמר נפלא.
כיף ללמוד ממישהו כמוך.
מחבר המאמר מיכאל ארנזון (Michael בפורום)
כל התודות מגיעות לו :)
סליחה,לא שמתי לב שמישהו אחר כתב את המאמר... בכל זאת מאמר יפה מאוד. תודה רבה.
איך אני משלב preg_match עם curl?
כדי ש curl תחזיר לך מחרוזת לתוך משתנה שתוכל להשתמש בה בתוך preg_match עליך להגדיר את האופציה CURLOPT_RETURNTRANSFER ל true